home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / toda / src / vsave.c < prev   
Text File  |  1991-10-18  |  45KB  |  1,724 lines

  1. /*
  2.             MOV DATA SAVE
  3.  
  4.             Hiroshi TODA
  5.             1991 7/28
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <egb.h>
  11. #include <mos.h>
  12. #include "video.h"
  13.  
  14. #define C_COLOR 15        /* Command color palette */
  15. #define W_COLOR 8        /* Window color palette */
  16. #define B_COLOR 7        /* Back color palette */
  17. #define E_COLOR 10        /* ERROR color palette */
  18. #define OK_COLOR 12        /* OK color palette */
  19.  
  20. extern quad_expand(int epvar[],int ecvar[][2],char *ework,char *gwork,char *bbuf);
  21. extern int windget();
  22. extern int gprint( char *, int x, int y );
  23. extern int gprint2( char *, int x, int y );
  24. extern int mouse( int mpara[], int, int, int );
  25. extern int windput();
  26. extern int error_check( int );
  27. extern int filename( char *path, char *fullname );
  28. extern int fileinput( char *fullname );
  29. extern int itochar( int var, int n, char *dsp );
  30. extern int display_scale();
  31. extern int dezitize( int mode );
  32.  
  33. extern int sw,cx,cy;        /* MOUSE data */
  34. extern int pn;            /* POLYGON point counter */
  35.  
  36. extern int col[][4];        /* paint & load  color data*/
  37. extern int lvar[];            /* var. */
  38. extern int svar[];
  39. extern int epvar[];    /* page1, page2, color, svar-address, pn */
  40. extern int ecvar[][2];
  41. extern char path2[];        /* PATH NAME2 (graphic loader) */
  42. extern char fullname2[];    /* PATH + FILES NAME2 */
  43.  
  44. extern int mpara[];        /* mouse para */
  45. extern char para[];        /* PARAM */
  46. extern char gwork[];    /* graph work */
  47. extern char ework[];    /* EGB work */
  48. extern char bbuf[];    /* BACK-UP buf. */
  49. extern char rbuf[];    /* RAM-DISK buf. */
  50. extern char rbuf2[];    /* RAM-DISK buf. */
  51.  
  52. /* filename → filename.mov */
  53.  
  54. mov_file_set( name, namemov )
  55. char name[], namemov[];
  56. {
  57.     int i;
  58.  
  59.     for( i=0 ; i<76 ; i++ ){
  60.         namemov[i] = name[i];
  61.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  62.     }
  63.     return 55;        /* bad file name */
  64. mov01:    if( i == 0 )return 55;
  65.     namemov[i++] = '.'; namemov[i++] = 'M'; namemov[i++] = 'O';
  66.     namemov[i++] = 'V'; namemov[i] = (char)0;
  67.     return 0;
  68. }
  69.  
  70. /* mov2 head read */
  71.  
  72. mov_head_read(namemov, svar)
  73. char *namemov;
  74. int svar[];
  75. {
  76.     FILE *fp;
  77.     int n, temp, page, size, data[64];
  78.     char para[80];
  79.  
  80.     if( ( fp = fopen( namemov, "rb" ) ) == NULL )return 1;
  81.     temp = fread( (char *)data, 1, 256, fp );
  82.     if( temp < 256 )goto movh10;
  83.     if( data[0] != 0x32564f4d )goto movh10;
  84.     if( data[1] != 16 )goto movh10;
  85.     if( data[4] != 320 )goto movh10;
  86.     if( data[5] != 240 )goto movh10;
  87.     svar[0] = data[3];            /* page  */
  88.     svar[1] = data[2];            /* total */
  89.     DWORD( para+0 ) = (unsigned int)bbuf;
  90.     DWORD( para+4 ) = (unsigned int)rbuf;
  91.     DWORD( para+8 ) = 0;
  92.     DWORD( para+12) = 0;
  93.     n = 0;
  94. movh01:    temp = fread( bbuf, 1, 32, fp );
  95.     if( temp < 32 )goto movh10;
  96.     page = DWORD( bbuf ); size = DWORD( bbuf + 4 );
  97.     if( (unsigned int)size > 500000 )goto movh10;
  98.     temp = fread( bbuf+32, 1, size, fp );
  99.     if( temp < size )goto movh10;
  100.     WORD( bbuf+12 ) = 0;        /* wait なし */
  101.     move32( para );
  102.     n++;
  103.     if( n < svar[0] )goto movh01;
  104.     fclose( fp );
  105.     return 0;
  106. movh10:    fclose( fp );
  107.     return 58;
  108. }
  109.  
  110. /* mov replay */
  111.  
  112. mov_replay(namemov, p)
  113. char *namemov;
  114. int p;
  115. {
  116.     FILE *fpl;
  117.     int temp, page, size, n, data[64];
  118.     char para[16];
  119.  
  120.     if( ( fpl = fopen( namemov, "rb" ) ) == NULL )return 1;
  121.     temp = fread( (char *)data, 1, 256, fpl );
  122.     if( temp < 256 )goto rep10;
  123.     if( data[0] != 0x564f4d )goto rep10;
  124.     if( data[1] != 16 )goto rep10;
  125.     if( data[4] != 320 )goto rep10;
  126.     if( data[5] != 240 )goto rep10;
  127.     DWORD( para+0 ) = (unsigned int)bbuf;
  128.     DWORD( para+4 ) = (unsigned int)bbuf+0x40000;
  129.     DWORD( para+8 ) = 0;
  130.     DWORD( para+12) = 0;
  131.     n = 0;
  132. rep1:    if( n >= data[3] ){
  133.         fclose( fpl );
  134.         return 54;
  135.     }
  136.     temp = fread( bbuf, 1, 8, fpl );
  137.     if( temp < 8 )goto rep10;
  138.     page = DWORD( bbuf ); size = DWORD( bbuf + 4 );
  139.     if( (unsigned int)size > 500000 )goto rep10;
  140.     temp = fread( bbuf+8, 1, size, fpl );
  141.     if( temp < size )goto rep10;
  142.     move32_o( para );
  143.     n++;
  144.     if( n < p )goto rep1;
  145. rep8:    fclose( fpl );
  146.     return 0;
  147. rep10:    fclose( fpl );
  148.     return 58;
  149. }
  150.  
  151. /* 新mov2 replay  mode=1:page判定 */
  152.  
  153. mov_replay2(namemov, p, mode)
  154. char *namemov;
  155. int p, mode;
  156. {
  157.     FILE *fpl;
  158.     int temp, page, size, n, data[64];
  159.     char para[80];
  160.  
  161.     if( ( fpl = fopen( namemov, "rb" ) ) == NULL )return 1;
  162.     temp = fread( (char *)data, 1, 256, fpl );
  163.     if( temp < 256 )goto rep10;
  164.     if( data[0] != 0x32564f4d )goto rep10;
  165.     if( data[1] != 16 )goto rep10;
  166.     if( data[4] != 320 )goto rep10;
  167.     if( data[5] != 240 )goto rep10;
  168.     DWORD( para+0 ) = (unsigned int)bbuf;
  169.     DWORD( para+4 ) = (unsigned int)bbuf+0x40000;
  170.     DWORD( para+8 ) = 0;
  171.     DWORD( para+12) = 0;
  172.     n = 0;
  173. rep1:    if( n >= data[3] && mode ){
  174.         fclose( fpl );
  175.         return 54;
  176.     }
  177.     temp = fread( bbuf, 1, 32, fpl );
  178.     if( temp < 32 )goto rep10;
  179.     page = DWORD( bbuf ); size = DWORD( bbuf + 4 );
  180.     if( (unsigned int)size > 500000 )goto rep10;
  181.     temp = fread( bbuf+32, 1, size, fpl );
  182.     if( temp < size )goto rep10;
  183.     WORD( bbuf+12 ) = 0;        /* wait なし */
  184.     move32( para );
  185.     n++;
  186.     if( n < p )goto rep1;
  187. rep8:    fclose( fpl );
  188.     return 0;
  189. rep10:    fclose( fpl );
  190.     return 58;
  191. }
  192.  
  193. /* GUI graphic loader */
  194.  
  195. graphic_load( path, fullname )
  196. char path[64], fullname[80];
  197. {
  198.     char nametif[80];    /* tiff file name */
  199.     char namemov[80];    /* mov file name */
  200.     int min,max,i,j,k,wt,x0=0,y0=0,x1=0,y1=0;
  201.     int data[10];
  202.     char dsp1[] = "<<LOAD>> (B   R   G  )   MODE(      ,    )  MIX       MOVE(page   )  FILES  EXIT";
  203.     char dsp2[] = "TIFF  FREE(x    y    o    )  NAME <<                                          >>";
  204.  
  205. load01:    windget();
  206.     gprint( dsp1, 0, 463 );
  207.     gprint( dsp2, 0, 479 );
  208.     gprint2( fullname, 296, 479 );
  209.     for( i = 0 ; i < 10 ; i++ )data[i] = -1;
  210.     graphic_load_dsp(data);
  211. load02:    col[0][0] = col[0][1]+(col[0][2] << 5)+(col[0][3] << 10);
  212.     DWORD(para+0) = 1;            /* files背景色 */
  213.     DWORD(para+4) = 14;
  214.     DWORD(para+8) = (col[0][1] << 3)+(col[0][2] << 11)+(col[0][3] << 19);
  215.     EGB_palette(ework,1,para);
  216.     EGB_color( ework, 0, 14 );
  217.     gprint( "■", 176, 463 );
  218.     EGB_color( ework, 0, C_COLOR );
  219.     MOS_disp(1);
  220.     mouse(mpara,0,0,1);
  221.     if( cy < 447 )goto load02;
  222.     if( cy < 463 ){
  223.         if( cx < 72 )goto load02;
  224.         if( cx < 108 ){            /* B */
  225.             i = 5; min = 0; max = 31;
  226.             goto load07;
  227.         }
  228.         if( cx < 140 ){            /* R */
  229.             i = 6; min = 0; max = 31;
  230.             goto load07;
  231.         }
  232.         if( cx < 176 ){            /* G */
  233.             i = 7; min = 0; max = 31;
  234.             goto load07;
  235.         }
  236.         if( cx < 192 ){            /* spuit -> 7 */
  237.             j = 7;
  238.             goto load03;
  239.         }
  240.         if( cx < 292 ){            /* mode1 */
  241.             i = 3; min = 0; max = 3;
  242.             goto load07;
  243.         }
  244.         if( cx < 344 ){            /* mode2 */
  245.             i = 8; min = 0; max = 1;
  246.             goto load07;
  247.         }
  248.         if( cx < 408 ){            /* mix */
  249.             i = 4; min = 0; max = 256;
  250.             goto load07;
  251.         }
  252.         if( cx < 424 )goto load02;
  253.         if( cx < 468 ){            /* move -> 6 */
  254.             j = 6;
  255.             goto load03;
  256.         }
  257.         if( cx < 544 ){            /* page */
  258.             i = 9; min = 1; max = 999;
  259.             goto load07;
  260.         }
  261.         if( cx < 600 ){            /* files -> 1 */
  262.             j = 1;
  263.             goto load03;
  264.         }
  265.         if( cx < 640 ){            /* exit -> 2 */
  266.             j = 2;
  267.             goto load03;
  268.         }
  269.         goto load02;
  270.     }
  271.     if( cy < 480 ){
  272.         if( cx < 40 ){            /* tiff load -> 3 */
  273.             j = 3;
  274.             goto load03;
  275.         }
  276.         if( cx < 84 ){            /* free load -> 4 */
  277.             j = 4;
  278.             goto load03;
  279.         }
  280.         if( cx < 124 ){            /* X */
  281.             i = 0; min = 1; max = 512;
  282.             goto load07;
  283.         }
  284.         if( cx < 164 ){            /* Y */
  285.             i = 1;
  286.             min = 1; max = 512;
  287.             goto load07;
  288.         }
  289.         if( cx < 224 ){            /* offset */
  290.             i = 2;
  291.             min = 0; max = 9999;
  292.             goto load07;
  293.         }
  294.         if( cx < 640 ){            /* file name -> 5 */
  295.             j = 5;
  296.             goto load03;
  297.         }
  298.         goto load02;
  299.     }
  300.     goto load02;
  301. load03:    mouse(mpara,0,0,0);
  302.     if( sw > 1 )goto load02;
  303.     MOS_disp(0);
  304.     windput();
  305.     switch( j ){
  306.         case 1: filename( path, fullname );
  307.             break;
  308.         case 2: return 0;
  309.         case 3: tif_file_set( fullname, nametif );
  310.             error_check( tif_load( nametif, lvar, col[0][0] ) );
  311.             return 0;
  312.         case 4: error_check( freeload( fullname, lvar, col[0][0] ) );
  313.             return 0;
  314.         case 5: fileinput( fullname );
  315.             break;
  316.         case 6: mov_file_set( fullname, namemov );
  317.             error_check( replay_load(namemov, lvar, col[0][0]) );
  318.             return 0;
  319.         case 7:    mode10_color_spuit( col );
  320.             break;
  321.     }
  322.     goto load01;
  323. load07:    wt = 125000;
  324.     lvar[5] = col[0][1];
  325.     lvar[6] = col[0][2];
  326.     lvar[7] = col[0][3];
  327. load08:    if( sw == 1 )lvar[i] = lvar[i] + 1;
  328.     if( sw == 2 )lvar[i] = lvar[i] - 1;
  329.     if( lvar[i] < min )lvar[i] = max;
  330.     if( lvar[i] > max )lvar[i] = min;
  331.     col[0][1] = lvar[5];
  332.     col[0][2] = lvar[6];
  333.     col[0][3] = lvar[7];
  334.     graphic_load_dsp(data);
  335.     for( k = 0 ; k < wt ; k++ );
  336.     wt = 10000;
  337.     MOS_rdpos(&sw,&cx,&cy);
  338.     if( sw > 0 )goto load08;
  339.     goto load02;
  340. }
  341.  
  342. graphic_load_dsp(data)
  343. int data[8];
  344. {
  345.     int i, x, y;
  346.     int point[][3] = {    {  96,479,3 },
  347.                 { 136,479,3 },
  348.                 { 176,479,4 },
  349.                 { 240,463,5 },
  350.                 { 376,463,3 },
  351.                 {  88,463,2 },
  352.                 { 120,463,2 },
  353.                 { 152,463,2 },
  354.                 { 296,463,5 },    /* 1990 9/6 for fix or mov */
  355.                 { 504,463,3 }    /* 1991 2/16 for move page */
  356.               };
  357.     char dsp[10];
  358.  
  359.     lvar[5] = col[0][1];
  360.     lvar[6] = col[0][2];
  361.     lvar[7] = col[0][3];
  362.     col[0][0] = col[0][1]+(col[0][2] << 5)+(col[0][3] << 10);
  363.     for( i = 0 ; i < 10 ; i++ ){
  364.         if( data[i] != lvar[i] ){
  365.             MOS_disp(0);
  366.             itochar( lvar[i], point[i][2], dsp );
  367.             EGB_color(ework,0,C_COLOR);
  368.             x = point[i][0];  y = point[i][1];
  369.             if( (i!=3) && (i!=8) )gprint2( dsp, x, y );
  370.             if( i == 3 ){
  371.                 if( lvar[3]==0 )gprint2( "normal", x, y );
  372.                 if( lvar[3]==1 )gprint2( "ovlay ", x, y );
  373.                 if( lvar[3]==2 )gprint2( "chrma ", x, y );
  374.                 if( lvar[3]==3 )gprint2( "plygn ", x, y );
  375.             }
  376.             if( i == 8 ){
  377.                 if( lvar[8]==0 )gprint2( "fix ", x, y );
  378.                 if( lvar[8]==1 )gprint2( "move", x, y );
  379.             }
  380.             data[i] = lvar[i];
  381.         }
  382.     }
  383.     return 0;
  384. }
  385.  
  386. /* filename → filename.tif */
  387.  
  388. tif_file_set( name, nametif )
  389. char name[], nametif[];
  390. {
  391.     int i;
  392.  
  393.     for( i=0 ; i<76 ; i++ ){
  394.         nametif[i] = name[i];
  395.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  396.     }
  397.     return 55;        /* bad file name */
  398. mov01:    if( i == 0 )return 55;
  399.     nametif[i++] = '.'; nametif[i++] = 'T'; nametif[i++] = 'I';
  400.     nametif[i++] = 'F'; nametif[i] = (char)0;
  401.     return 0;
  402. }
  403.  
  404. freeload( fullname, lvar, color )
  405. char *fullname;
  406. int lvar[], color;
  407. {
  408.     FILE *fpl;
  409.     int size, xd, yd, temp, temp2;
  410.     int xb1, yb1, xb2, yb2;
  411.     char para[64];
  412.  
  413.     size = lvar[0] * lvar[1] * 2;
  414.     xd = lvar[0] - 1;
  415.     yd = lvar[1] - 1;
  416.     if( lvar[8] ){                    /* move */
  417.         display_scale();
  418.         EGB_writePage(ework,0);        /* mode10に書き込み */
  419.         MOS_horizon(0,319);
  420.         MOS_setpos( xd >> 1, yd >> 1 );
  421.         mouse(mpara,xd,yd,6);
  422.         EGB_writePage(ework,1);        /* mode3に書き込み */
  423.         MOS_horizon(0,639);
  424.         MOS_setpos( 320, 240 );
  425.         if( sw > 1 )return 0;
  426.     }
  427.     if( ( fpl = fopen( fullname, "rb" ) ) == NULL ){
  428.         return 1;
  429.     }
  430.     fseek( fpl, lvar[2], SEEK_SET );
  431.     temp = fread( bbuf, 1, size, fpl );
  432.     temp2 = ferror( fpl );
  433.     fclose( fpl );
  434.     if( lvar[8] ){
  435.         xb1 = cx - (xd >> 1);
  436.         yb1 = cy - (yd >> 1);
  437.     }
  438.     else { xb1 = 0; yb1 = 0; }
  439.     if( temp < size )yd = temp/2/(xd+1) - 1;    /* too small data */
  440.     if( yd < 0 )yd = 0;
  441.     xb2 = xb1 + xd;
  442.     yb2 = yb1 + yd;
  443.     DWORD(para+0) =  (unsigned int)bbuf;        /* polygon bit 反転 */
  444.     DWORD(para+4) =  0x104;
  445.     DWORD(para+8) =  10;
  446.     puta17( gwork, para );
  447.     DWORD(para+0) = (unsigned int)bbuf;
  448.     DWORD(para+4) = 0x104;
  449.     DWORD(para+8) = xb1;
  450.     DWORD(para+12) = yb1;
  451.     DWORD(para+16) = xb2;
  452.     DWORD(para+20) = yb2;
  453.     DWORD(para+24) = lvar[3];
  454.     DWORD(para+28) = color;
  455.     DWORD(para+32) = lvar[4];
  456.     put17(gwork,para);
  457.     if( temp2 )return 1;
  458.     return 0;
  459. }
  460.  
  461. tif_load( fullname, lvar, color )
  462. char *fullname;
  463. int lvar[], color;
  464. {
  465.     FILE *fpl;
  466.     int size, xd, yd, temp, temp2;
  467.     int xb1, yb1, xb2, yb2;
  468.     char para[64];
  469.  
  470.     if( ( fpl = fopen( fullname, "rb" ) ) == NULL ){
  471.         return 1;
  472.     }
  473.         /* head read & seek to top data */
  474.     if( tif_head_read( fpl, gwork, &xd, &yd ) == -1 ){
  475.         fclose( fpl );
  476.         return 58;
  477.     }
  478.     size = xd * yd * 2;
  479.     xd = xd - 1; yd = yd - 1;
  480.     if( lvar[8] ){                    /* move */
  481.         display_scale();
  482.         EGB_writePage(ework,0);        /* mode10に書き込み */
  483.         MOS_horizon(0,319);
  484.         MOS_setpos( xd >> 1, yd >> 1 );
  485.         mouse(mpara,xd,yd,6);    /* ydは変わる可能性有り */
  486.         EGB_writePage(ework,1);        /* mode3に書き込み */
  487.         MOS_horizon(0,639);
  488.         MOS_setpos( 320, 240 );
  489.         if( size > 512*512*2 )size = 512*512*2;    /* ovar buffer area */
  490.         if( sw > 1 ){
  491.             fclose( fpl );
  492.             return 0;
  493.         }
  494.     }
  495.     temp = fread( bbuf, 1, size, fpl );
  496.     temp2 = ferror( fpl );
  497.     fclose( fpl );
  498.     if( lvar[8] ){
  499.         xb1 = cx - (xd >> 1);
  500.         yb1 = cy - (yd >> 1);
  501.     }
  502.     else { xb1 = 0; yb1 = 0; }
  503.     yd = size/2/(xd+1) - 1;
  504.     if( temp < size )yd = temp/2/(xd+1) - 1;    /* too small data */
  505.     if( yd < 0 )yd = 0;
  506.     xb2 = xb1 + xd;
  507.     yb2 = yb1 + yd;
  508.     DWORD(para+0) =  (unsigned int)bbuf;    /* polygon bit 反転 */
  509.     DWORD(para+4) =  0x104;
  510.     DWORD(para+8) =  10;
  511.     puta17( gwork, para );
  512.     DWORD(para+0) = (unsigned int)bbuf;
  513.     DWORD(para+4) = 0x104;
  514.     DWORD(para+8) = xb1;
  515.     DWORD(para+12) = yb1;
  516.     DWORD(para+16) = xb2;
  517.     DWORD(para+20) = yb2;
  518.     DWORD(para+24) = lvar[3];
  519.     DWORD(para+28) = color;
  520.     DWORD(para+32) = lvar[4];
  521.     put17(gwork,para);
  522.     EGB_clearScreen(ework);            /* mode 3 clear */
  523.     if( temp2 )return 1;
  524.     return 0;
  525. }
  526.  
  527. tif_head_read( fpl, work, x, y )
  528. FILE *fpl;
  529. char work[];
  530. int *x, *y;
  531. {
  532.     int i, m, n, size, tag, type, count, data, length;
  533.  
  534.     *x = -1; *y = -1; size = -1;
  535.     m = 0;                /* total data count */
  536.     if( fread( work, 1, 512, fpl ) < 512 )return -1;
  537.     m = DWORD( work + 4 );        /* m = offset to IFD */
  538.     if( (unsigned int)m > 511 )return -1;
  539.     n = WORD( work + m );        /* タグの数 */
  540.     m = m + 2;
  541.     if( (unsigned int)n > 40 )n = 40;  /* タグは40まで(512Byteを越える) */
  542.     if( (unsigned int)(m + n*12) > 511 )return -1;
  543.     for( i=0 ; i<n ; i++ ){
  544.         tag   = WORD(  work + m + 0 );
  545.         type  = WORD(  work + m + 2 );
  546.         count = DWORD( work + m + 4 );
  547.         data  = DWORD( work + m + 8 );
  548.         if( type == 2 )goto head01;        /* type2 : ASII */
  549.         if( type == 5 )goto head01;        /* type5 : RATIONAL */
  550.         length = type;                /* length check */
  551.         if( type == 3 )length = 2;
  552.         if( count*length > 4 )goto head01;    /* offset無視 */
  553.         if( type == 1 )data = data & 0xff;    /* type1 : BYTE */
  554.         if( type == 3 )data = data & 0xffff;    /* type3 : WORD */
  555.         if( tag == 0x100 )*x = data;
  556.         if( tag == 0x101 )*y = data;
  557.         if( ( tag == 0x102 ) && ( data != 16 ) )return -1;
  558.         if( tag == 0x111 )size = data;
  559.     head01:    m = m + 12;
  560.     }
  561.     if( (*x<=0) || (*y<=0) || (size<=0) )return -1;
  562.     if( size != 512 )fseek( fpl, size, SEEK_SET );
  563.     return 0;
  564. }
  565.  
  566. replay_load(namemov, lvar, color)
  567. char *namemov;
  568. int lvar[], color;
  569. {
  570.     int temp;
  571.  
  572.     DWORD(para+0) = (unsigned int)bbuf;    /* 画面1 -> bbuf */
  573.     DWORD(para+4) = 0;
  574.     DWORD(para+8) = 0x104;
  575.     DWORD(para+12) = 245760;
  576.     getbrock(gwork,para);
  577.     DWORD(para+4) = 0x40000;        /* bbuf -> 画面2 */
  578.     putbrock(gwork,para);
  579.     temp = mov_replay2( namemov, lvar[9], 1 );
  580.     if( temp == 58 )temp = mov_replay( namemov, lvar[9] );
  581.     if( (lvar[3] == 0) && (lvar[4] == 256) )goto rep1;
  582.     DWORD(para+0) = (unsigned int)bbuf;    /* 画面1 -> bbuf */
  583.     DWORD(para+4) = 0;
  584.     DWORD(para+8) = 0x104;
  585.     DWORD(para+12) = 245760;
  586.     getbrock(gwork,para);
  587.     DWORD(para+0) = (unsigned int)bbuf+0x40000;    /* 画面2 -> bbuf2 */
  588.     DWORD(para+4) = 0x40000;
  589.     DWORD(para+8) = 0x104;
  590.     DWORD(para+12) = 245760;
  591.     getbrock(gwork,para);
  592.     DWORD(para+4) = 0;            /* bbuf2 -> 画面 */
  593.     putbrock(gwork,para);
  594.     DWORD(para+0) =  (unsigned int)bbuf;    /* polygon bit 反転 */
  595.     DWORD(para+4) =  0x104;
  596.     DWORD(para+8) =  10;
  597.     puta17( gwork, para );
  598.     DWORD(para+0) = (unsigned int)bbuf;
  599.     DWORD(para+4) = 0x104;
  600.     DWORD(para+8) = 0;
  601.     DWORD(para+12) = 0;
  602.     DWORD(para+16) = 511;
  603.     DWORD(para+20) = 239;
  604.     DWORD(para+24) = lvar[3];
  605.     DWORD(para+28) = color;
  606.     DWORD(para+32) = lvar[4];
  607.     put17(gwork,para);
  608. rep1:    return temp;
  609. }
  610.  
  611. mode10_color_spuit( color )
  612. int color[];
  613. {
  614.     EGB_writePage(ework,0);        /* mode10に書き込み */
  615.     MOS_horizon(0,319);
  616.     MOS_vertical(0,239);
  617.     MOS_setpos( 160, 120 );
  618.     MOS_disp(0);
  619. spuit1:    mouse(mpara,0,0,10);
  620.     if( sw > 1 )goto spuit2;
  621.     color[0] = peekw( 1024*cy+2*cx, 0x104 ) & 0x7fff;
  622.     color[1] = color[0] & 0x1f;
  623.     color[2] = ( color[0] >> 5 ) & 0x1f;
  624.     color[3] = ( color[0] >> 10 ) & 0x1f;
  625. spuit2:    EGB_writePage(ework,1);            /* mode3に書き込み */
  626.     MOS_horizon(0,639);
  627.     MOS_vertical(0,479);
  628.     MOS_setpos( 320, 240 );
  629.     return 0;
  630. }
  631.  
  632. mov_save( namemov )
  633. char *namemov;
  634. {
  635.     int min,max,i,j,k,wt,mode;
  636.     int data[13];
  637.     char dsp1[] = "<<REC  page            Byte>> LOAD  VIDEO  EXPAND  ROUGH=    PRE-M0VE=      EXIT";
  638.     char dsp2[] = " REC1  REC2  REPLAY(page   )  AREA(   ,   )-(   ,   ) BACK-COLOR=(B   R   G  )  ";
  639.  
  640. /*    svar[2] = 8; */            /* rough */
  641. /*    svar[3] = 0; */            /* pre-move */
  642.     svar[4] = 0; svar[5] = 0;    /* 座標 */
  643.     svar[6] = 319; svar[7] = 239;
  644.     svar[11] = -1;            /* replay page */
  645. /*    svar[12] = */        /* リザーブ */
  646. save1:    windget();
  647.     if( svar[0] && svar[11] < 0 )svar[11] = 1;    /* replay 解除 */
  648.     gprint( dsp1, 0, 463 );
  649.     gprint( dsp2, 0, 479 );
  650.     EGB_color(ework,0,E_COLOR);
  651.     gprint( " REC1  REC2", 0, 479 );
  652.     EGB_color(ework,0,OK_COLOR);
  653.     gprint( "EXIT", 608, 463 );
  654.     EGB_color(ework,0,C_COLOR);
  655.     for( i = 0 ; i < 13 ; i++ )data[i] = 0xffff;
  656.     mov_save_dsp(data,svar);
  657. save2:    col[1][0] = col[1][1]+(col[1][2] << 5)+(col[1][3] << 10);
  658.     DWORD(para+0) = 1;            /* files背景色 */
  659.     DWORD(para+4) = 14;
  660.     DWORD(para+8) = (col[1][1] << 3)+(col[1][2] << 11)+(col[1][3] << 19);
  661.     EGB_palette(ework,1,para);
  662.     EGB_color( ework, 0, 14 );
  663.     gprint( "■", 624, 479 );
  664.     EGB_color( ework, 0, C_COLOR );
  665.     MOS_disp(1);
  666.     mouse(mpara,  0, 0, 1);
  667.     if( cy < 447 )goto save2;
  668.     if( cy < 463 ){
  669.         if( cx < 232 )goto save2;
  670.         if( cx < 280 ){            /* LOAD 0 */
  671.             j = 0;
  672.             goto save3;
  673.         }
  674.         if( cx < 336 ){            /* dezitize 1 */
  675.             j = 1;
  676.             goto save3;
  677.         }
  678.         if( cx < 400 ){            /* expand 6 */
  679.             j = 6;
  680.             goto save3;
  681.         }
  682.         if( cx < 480 ){            /* rough */
  683.             i = 2; min = 0; max = 99;
  684.             goto save7;
  685.         }
  686.         if( cx < 584 ){            /* pre move */
  687.             i = 3; min = 0; max = 16;
  688.             goto save7;
  689.         }
  690.         if( cx < 600 )goto save2;
  691.         if( cx < 640 ){            /* exit 2 */
  692.             j = 2;
  693.             goto save3;
  694.         }
  695.         goto save2;
  696.     }
  697.     if( cy < 480 ){
  698.         if( cx < 48 ){            /* rec1 */
  699.             mode = 0;
  700.             j = 3;
  701.             goto save3;
  702.         }
  703.         if( cx < 96 ){            /* rec2 */
  704.             mode = 1;
  705.             j = 3;
  706.             goto save3;
  707.         }
  708.         if( cx < 152 ){            /* replay 4 */
  709.             if( svar[0] == 0 )goto save2;
  710.             j = 4;
  711.             goto save3;
  712.         }
  713.         if( cx < 232 ){            /* page */
  714.             if( svar[0] == 0 )goto save2;
  715.             i = 11; min = 1; max = svar[0];
  716.             goto save7;
  717.         }
  718.         if( cx < 276 ){            /* area 5 */
  719.             j = 5;
  720.             goto save3;
  721.         }
  722.         if( cx < 308 ){            /* x1 */
  723.             i = 4; min = 0; max = 319;
  724.             goto save7;
  725.         }
  726.         if( cx < 348 ){            /* y1 */
  727.             i = 5; min = 0; max = 239;
  728.             goto save7;
  729.         }
  730.         if( cx < 388 ){            /* x2 */
  731.             i = 6; min = 0; max = 319;
  732.             goto save7;
  733.         }
  734.         if( cx < 432 ){            /* y2 */
  735.             i = 7; min = 0; max = 239;
  736.             goto save7;
  737.         }
  738.         if( cx < 520 )goto save2;
  739.         if( cx < 556 ){            /* b */
  740.             i = 8; min = 0; max = 31;
  741.             goto save7;
  742.         }
  743.         if( cx < 588 ){            /* r */
  744.             i = 9; min = 0; max = 31;
  745.             goto save7;
  746.         }
  747.         if( cx < 624 ){            /* g */
  748.             i = 10; min = 0; max = 31;
  749.             goto save7;
  750.         }
  751.         if( cx < 640 ){            /* spuit 7 */
  752.             j = 7;
  753.             goto save3;
  754.         }
  755.         goto save2;
  756.     }
  757.     goto save2;
  758. save3:    mouse(mpara,  0, 0, 0);
  759.     if( sw > 1 )goto save2;
  760.     MOS_disp(0);
  761.     windput();
  762.     switch( j ){
  763.         case 0: graphic_load( path2, fullname2 );    /* load */
  764.             break;
  765.         case 1:    dezitize(0);            /* dezitize */
  766.             break;
  767.         case 2:    error_check( mov_save_end(namemov,svar) ); /* exit */
  768.             return 0;
  769.         case 3:    if(
  770.                 error_check( mov_save_page(namemov,mode,svar) )
  771.             )return 0;
  772.             break;
  773.         case 4:    error_check( mov_replay2( namemov, svar[11], 0 ) );
  774.             break;
  775.         case 5: mov_save_coodr(svar);        /* area */
  776.             break;
  777.         case 6:    epvar[2] = col[1][0];        /* expand */
  778.             epvar[3] = (unsigned int)svar;
  779.             epvar[4] = pn;
  780.             epvar[5] = (unsigned int)namemov;
  781.             if(quad_expand(epvar,ecvar,ework,gwork,rbuf2))return 0;
  782.             break;
  783.         case 7:    mode10_color_spuit( *(col+1) );
  784.             break;
  785.     }
  786.     goto save1;
  787.  
  788. save7:    wt = 125000;
  789.     svar[8] = col[1][1];
  790.     svar[9] = col[1][2];
  791.     svar[10] = col[1][3];
  792. save8:    if( sw == 1 )svar[i] = svar[i] + 1;
  793.     if( sw == 2 )svar[i] = svar[i] - 1;
  794.     if( svar[i] < min )svar[i] = max;
  795.     if( svar[i] > max )svar[i] = min;
  796.     col[1][1] = svar[8];
  797.     col[1][2] = svar[9];
  798.     col[1][3] = svar[10];
  799.     mov_save_dsp(data,svar);
  800.     for( k = 0 ; k < wt ; k++ );
  801.     wt = 10000;
  802.     MOS_rdpos(&sw,&cx,&cy);
  803.     if( sw > 0 )goto save8;
  804.     goto save2;
  805. }
  806.  
  807. mov_save_dsp(data,var)
  808. int data[],var[];
  809. {
  810.     int i, x, y;
  811.     int point[][3] = {    {  88,463,3 },
  812.                 { 120,463,8 },
  813.  
  814.                 { 456,463,2 },    /* rough rate */
  815.                 { 560,463,2 },    /* pre move */
  816.  
  817.                 { 280,479,3 },    /* 座標 */
  818.                 { 312,479,3 },
  819.                 { 360,479,3 },
  820.                 { 392,479,3 },
  821.  
  822.                 { 536,479,2 },    /* color */
  823.                 { 568,479,2 },
  824.                 { 600,479,2 },
  825.  
  826.                 { 192,479,3 },    /* page */
  827.               };
  828.     char dsp[10];
  829.  
  830.     svar[8] = col[1][1];
  831.     svar[9] = col[1][2];
  832.     svar[10] = col[1][3];
  833.     col[1][0] = col[1][1]+(col[1][2] << 5)+(col[1][3] << 10);
  834.     EGB_color(ework,0,C_COLOR);
  835.     for( i = 0 ; i < 12 ; i++ ){
  836.         if( data[i] != var[i] ){
  837.             x = point[i][0]; y = point[i][1];
  838.             MOS_disp(0);
  839.             itochar( var[i], point[i][2], dsp );
  840.             gprint2( dsp, x, y );
  841.             data[i] = var[i];
  842.         }
  843.     }
  844.     return 0;
  845. }
  846.  
  847. mov_save_coodr( svar )
  848. int svar[];
  849. {
  850.     display_scale();
  851.     EGB_writePage(ework,0);        /* mode10に書き込み */
  852.     MOS_horizon(0,319);
  853.     MOS_vertical(0,239);
  854.     MOS_setpos( 160, 120 );
  855.     MOS_disp(0);
  856. save1:    mouse(mpara,0,0,10);
  857.     if( sw > 1 )goto save2;
  858.     svar[4] = cx; svar[5] = cy;
  859.     mouse(mpara,0,0,4);
  860.     if( sw > 1 )goto save1;
  861.     if( cx == svar[4] || cy == svar[5] )goto save2;
  862.     svar[6] = cx; svar[7] = cy;
  863. save2:    EGB_writePage(ework,1);            /* mode3に書き込み */
  864.     MOS_horizon(0,639);
  865.     MOS_vertical(0,479);
  866.     MOS_setpos( 320, 240 );
  867.     return 0;
  868. }
  869.  
  870. mov_save_trim( svar )
  871. int svar[];
  872. {
  873.     int color, x, y, temp, i, j;
  874.  
  875.     color = svar[8]+(svar[9] << 5)+(svar[10] << 10);
  876.     for( i=0 ; i<153600 ; i+=4 ){    /* r-buffer top bit clear */
  877.         DWORD( rbuf+i ) &= 0x7fff7fff;
  878.     }
  879.     for( j=0 ; j<245760 ; j+=4 ){    /* vram top bit clear */
  880.         poked( j, 0x104, ( peekd( j, 0x104 ) & 0x7fff7fff ) );
  881.     }
  882.     if( svar[4] > svar[6] ){
  883.         temp = svar[6]; svar[6] = svar[4]; svar[4] = temp;
  884.     }
  885.     if( svar[5] > svar[7] ){
  886.         temp = svar[7]; svar[7] = svar[5]; svar[5] = temp;
  887.     }
  888.     if(    svar[4] == 0    /* full area -> return */
  889.         && svar[5] == 0
  890.         && svar[6] == 319
  891.         && svar[7] == 239
  892.     )return 0;
  893.     for( y=0 ; y<240 ; y++ ){
  894.         for( x=0 ; x<320 ; x++ ){
  895.             if(     x < svar[4]
  896.                 ||  x > svar[6]
  897.                 ||  y < svar[5]
  898.                 ||  y > svar[7]
  899.             ){
  900.                 i = y*640 + x*2;    /* buffer add */
  901.                 j = (y << 10) + (x << 1);    /* vram */
  902.                 if( svar[0] ){
  903.                     WORD( rbuf+i ) |= 0x8000;
  904.                     xorw( j, 0x104, 0xffff );
  905.                 }
  906.                 else pokew( j, 0x104, color );
  907.             }
  908.         }
  909.     }
  910.     return 0;
  911. }
  912.  
  913. mov_save_end( namemov, svar )
  914. char *namemov;
  915. int svar[];
  916. {
  917.     FILE *fps;
  918.     int i, temp, data[2];
  919.  
  920.     if( svar[0] == 0 )return 0;
  921.     for( i=0 ; i<6 ; i++ ){        /* disk write protect の場合6回必要 */ 
  922.         if( ( fps = fopen( namemov, "r+b" ) ) != NULL )goto save2;
  923.     }
  924.     return 2;
  925. save2:    data[0] = svar[1]; data[1] = svar[0];    /* data長 page */
  926.     fseek( fps, 8, SEEK_SET );
  927.     fwrite( (char *)data, 1, 8, fps );
  928.     temp = ferror( fps );
  929.     fclose( fps );
  930.     if( temp ){
  931.         remove( namemov );        /* error */
  932.         return 2;
  933.     }
  934.     return 0;
  935. }
  936.  
  937. /* save心臓部 */
  938.  
  939. mov_save_page( namemov, mode, svar )
  940. char *namemov;
  941. int mode, svar[];
  942. {
  943.     FILE *fps;
  944.     int data;
  945.     int a1, a2, i, j, k, temp;
  946.     int n;
  947.  
  948.     /* mov head */
  949.     int mvhead1[] = { 0x32564f4d, 16, 0, 0, 320, 240, 640 };
  950.     int mvhead2[228]; 
  951.     int pghead[8];
  952.  
  953.     for( k=0 ; k<228 ; k++ )mvhead2[k] = 0;
  954.     temp = 0;
  955.     mov_save_trim( svar );            /* trimming */
  956.         /* 画面のはみ出した部分をclear */
  957.     EGB_writePage(ework,0);            /* mode10設定 */
  958.     EGB_color(ework,0,0);            /* clear paint */
  959.     EGB_color(ework,2,0);
  960.     EGB_paintMode(ework,0x22);
  961.     EGB_writeMode(ework,0);
  962.     EGB_penSize(ework,1);
  963.     WORD(para+0) = 320;
  964.     WORD(para+2) = 0;
  965.     WORD(para+4) = 511;
  966.     WORD(para+6) = 239;
  967.     EGB_rectangle(ework,para);
  968.     EGB_writePage(ework,1);            /* mode3に書き込み */
  969.     EGB_color(ework,0,C_COLOR);
  970.     if( svar[0] == 0 ){        /* page 0 */
  971.         for( k=0 ; k<131072 ; k+=4 ){ /* rbufを使って最多色検索 */
  972.             DWORD( rbuf+k ) = 0;    /* clear */
  973.         }
  974.         for( k=0 ; k<76800 ; k++ ){
  975.             data = peekw( ((k/320) << 10)+((k%320) << 1), 0x104 );
  976.             j = data << 2;
  977.             DWORD( rbuf+j ) +=1;
  978.         }
  979.         n = 0; data = 0;
  980.         for( k=0 ; k<32768 ; k++ ){
  981.             if( DWORD( rbuf+(k << 2) ) > n ){
  982.                 n = DWORD( rbuf+(k << 2) );
  983.                 data = k;
  984.             }
  985.         }
  986.         for( k=0 ; k<153600 ; k+=2 ){    /* 塗り潰し */
  987.             WORD( rbuf+k ) = data;
  988.             j = ( (k/640) << 10 ) + ( k % 640 );
  989.             if(
  990.              mov_save_cmp_data( data,peekw(j,0x104),svar[2] ) == 0
  991.             ){
  992.                 WORD( rbuf+k ) = data | 0x8000;    /* 処理印 */
  993.                 xorw( j, 0x104, 0xffff );
  994.             }
  995.         }
  996.             /* 孤立した点は処理解除 */
  997.         for( k=2 ; k<153598 ; k+=2 ){
  998.             if( (DWORD( rbuf+k ) & 0x80008000) == 0x8000
  999.             && (WORD( rbuf+k-2 ) & 0x8000) == 0 ){
  1000.                 WORD( rbuf+k ) &= 0x7fff;
  1001.                 j = ( (k/640) << 10 ) + ( k % 640 );
  1002.                 xorw( j, 0x104, 0xffff );
  1003.             }
  1004.         }
  1005.         i = 0;                /* data counter */
  1006.         if( mode )WORD( bbuf+i ) = 4;    /* brock 数 */
  1007.         else WORD( bbuf+i ) = 3;    /* brock 数 */
  1008.         i+=2;
  1009.         WORD( bbuf+i ) = 0x1422; i+=2;    /* stosd brock */
  1010.         DWORD( bbuf+i ) = 17; i+=4;    /* data size */
  1011.         WORD( bbuf+i ) = 1; i+=2;    /* data 数 */
  1012.         DWORD( bbuf+i ) = data + ( data << 16 ); i+=4; /* data */
  1013.         WORD( bbuf+i ) = 1; i+=2;    /* offset 数 */
  1014.         WORD( bbuf+i ) = 0x0000; i+=2;    /* offset */
  1015.         WORD( bbuf+i ) = 1; i+=2;    /* data 個数 */
  1016.         WORD( bbuf+i ) = 0x0000; i+=2;    /* 下位 address */
  1017.         BYTE( bbuf+i ) = 0xff; i+=1;    /* 長さ */
  1018.         WORD( bbuf+i ) = 38400; i+=2;
  1019.         if( mode )i = mov_save_stosw0( i, svar ); /* stosw 0type */
  1020.         i = mov_save_stosw1( i, svar );        /* stosw */
  1021.         i = mov_save_movsw( i );        /* movsw */
  1022.         pghead[0] = 0;            /* page page head */
  1023.         pghead[1] = i;            /* dsize */
  1024.         pghead[2] = 0;            /* ox,oy */
  1025.         pghead[3] = 0;            /* wait & loop */
  1026.         pghead[4] = 0;            /* リザーブ */
  1027.         pghead[5] = 0;            /* sound data1 */
  1028.         pghead[6] = 0;            /* sound data2 */
  1029.         pghead[7] = 0;            /* sound data3 */
  1030.         for( j=0 ; j<6 ; j++ ){    /* disk write protect の場合6回必要 */ 
  1031.             if( (fps=fopen(namemov,"wb") ) != NULL )goto save0;
  1032.         }
  1033.         return 2;
  1034.     save0:    fwrite( (char *)mvhead1, 1, 28, fps );    /* ヘッダー */
  1035.         fwrite( (char *)mvhead2, 1, 228, fps );
  1036.         fwrite( (char *)pghead, 1, 32, fps );
  1037.         fwrite( bbuf, 1, i, fps );
  1038.         temp = ferror( fps );
  1039.         fclose( fps );
  1040.         svar[1] = i + 32;
  1041.         goto save10;
  1042.     }
  1043.  
  1044.     /* page > 0 */
  1045.  
  1046.     i = 0;                /* data counter */
  1047.     if( mode )WORD( bbuf+i ) = 3;    /* brock 数 */
  1048.     else WORD( bbuf+i ) = 2;
  1049.     if( svar[3] )WORD( bbuf+i ) += 1;
  1050.     i+=2;
  1051.     if( svar[3] )i = mov_save_movebox16( i, svar );
  1052. /*    if( svar[3] )i = mov_save_move_all_box_16( i, svar );    */
  1053.  
  1054.     for( k=0 ; k<153600 ; k+=2 ){
  1055.         j = ( (k/640) << 10 ) + ( k % 640 );
  1056.         a1 = peekw( j, 0x104 ); a2 = DWORD( rbuf+k );
  1057.         if( mov_save_cmp_data( a1, a2, svar[2] ) == 0 
  1058.          && (a2 & 0x8000) == 0 ){
  1059.             WORD( rbuf+k ) = a2 | 0x8000;    /* 処理印 */
  1060.             xorw( j, 0x104, 0xffff );
  1061.         }
  1062.     }
  1063.             /* 孤立した点は処理解除 */
  1064.     for( k=2 ; k<153598 ; k+=2 ){
  1065.         if( (DWORD( rbuf+k ) & 0x80008000) == 0x8000
  1066.         && (WORD( rbuf+k-2 ) & 0x8000) == 0 ){
  1067.             WORD( rbuf+k ) &= 0x7fff;
  1068.             j = ( (k/640) << 10 ) + ( k % 640 );
  1069.             xorw( j, 0x104, 0xffff );
  1070.         }
  1071.     }
  1072.  
  1073.     if( mode )i = mov_save_stosw0( i, svar ); /* stosw 0type */
  1074.     i = mov_save_stosw1( i, svar );        /* stosw */
  1075.     i = mov_save_movsw( i );        /* movsw */
  1076.     pghead[0] = svar[0];        /* page page head */
  1077.     pghead[1] = i;            /* dsize */
  1078.     pghead[2] = 0;            /* ox,oy */
  1079.     pghead[3] = 0;            /* wait & loop */
  1080.     pghead[4] = 0;            /* リザーブ */
  1081.     pghead[5] = 0;            /* sound data1 */
  1082.     pghead[6] = 0;            /* sound data2 */
  1083.     pghead[7] = 0;            /* sound data3 */
  1084.     for( j=0 ; j<6 ; j++ ){    /* disk write protect の場合6回必要 */ 
  1085.         if( ( fps = fopen( namemov, "ab" ) ) != NULL )goto save2;
  1086.     }
  1087.     return 2;
  1088. save2:    fwrite( (char *)pghead, 1, 32, fps );
  1089.     fwrite( bbuf, 1, i, fps );
  1090.     temp = ferror( fps );
  1091.     fclose( fps );
  1092.     svar[1] = svar[1] + i + 32;
  1093. save10:    svar[0]++;
  1094.     if( temp ){
  1095.         remove( namemov );        /* disk full */
  1096.         return 2;
  1097.     }
  1098.     return 0;
  1099. }
  1100.  
  1101. /* store そのつどdataを読み込むtype */
  1102.  
  1103. mov_save_stosw0( i, svar )
  1104. int i;
  1105. int svar[];
  1106. {
  1107.     int p1, p4, p5, p6;
  1108.     int j, j2, j3;
  1109.     int k, k1;
  1110.     int a1, a2, data;
  1111.     int n2, n3;
  1112.  
  1113.     WORD( bbuf+i ) = 0x0222; i+=2;    /* stosw 0type brock */
  1114.     p1 = i; i+=4;            /* size point */
  1115.     p4 = i; i+=2;        /* offset count point */
  1116.     n2 = 0;            /* offset count */
  1117.     for( j2=0 ; j2<3 ; j2++ ){ /* offset loop */
  1118.         p5 = i;            /* offset top point */
  1119.         WORD( bbuf+i ) = j2; i+=2;    /* offset */
  1120.         p6 = i; i+=2;        /* d-address count point */
  1121.         n3 = 0;            /* d-address count */
  1122.         k = 0; k1 = 0;        /* data長count係数 */
  1123.         for( j3=0x10000*j2 ; j3<0x10000*(j2+1) ; j3+=2 ){
  1124.         if( j3 >= 153600 )break;
  1125.          j = ( (j3/640) << 10 ) + ( j3 % 640 );        /* vram add */
  1126.         a1 = peekw( j, 0x104 ); a2 = WORD( rbuf+j3 );
  1127.         if( k == 0 )data = a1;
  1128.         if( (a2 & 0x8000) == 0         /* 手つかず */
  1129.             && mov_save_cmp_data( data, a1, svar[2] ) == 0
  1130.                              /* 同色と認め */ 
  1131.         ){
  1132.             if( k == 0 )if(
  1133.                        mov_save_skip_check2(data,j3,svar)
  1134.                     )goto stos01;
  1135.             k++;
  1136.             WORD( rbuf+j3 ) = 0x8000 | data;    /* 処理印 */
  1137.             xorw( j, 0x104, 0xffff );
  1138.             if( k == 1 ){
  1139.             n3++;
  1140.             WORD( bbuf+i ) = ( j3 & 0xffff );
  1141.             }
  1142.             if( k<0xff ){
  1143.             BYTE( bbuf+i+2 ) = k;
  1144.             WORD( bbuf+i+3 ) = data;
  1145.             k1 = 2+1+2;
  1146.             }
  1147.             if( (k>=0xff) && (k<0xffff) ){
  1148.             BYTE( bbuf+i+2 ) = 0xff;
  1149.             WORD( bbuf+i+3 ) = k;
  1150.             WORD( bbuf+i+5 ) = data;
  1151.             k1 = 2+3+2;
  1152.             }
  1153.             if( k>=0xffff ){
  1154.             BYTE( bbuf+i+2 ) = 0xff;
  1155.             WORD( bbuf+i+3 ) = 0xffff;
  1156.             DWORD( bbuf+i+5 ) = k;
  1157.             WORD( bbuf+i+9 ) = data;
  1158.             k1 = 2+7+2;
  1159.             }
  1160.         }
  1161.         else {
  1162.             if( k ){
  1163.             i = i + k1;
  1164.             k = 0; k1 = 0;
  1165.             }
  1166.         }
  1167.     stos01: ;
  1168.         }
  1169.         i = i + k1;
  1170.         WORD( bbuf+p6 ) = n3;
  1171.         if( n3 )n2++;
  1172.         else i = p5;
  1173.  
  1174.     }
  1175.     WORD( bbuf+p4 ) = n2;
  1176.     if( n2 == 0 )i = p4;
  1177.     DWORD( bbuf+p1 ) = i - p4;
  1178.     return i;
  1179. }
  1180.  
  1181. /* store 最初にdataを読み込むtype */
  1182.  
  1183. mov_save_stosw1( i, svar )
  1184. int i;
  1185. int svar[];
  1186. {
  1187.     int p1, p2, p3, p4, p5, p6;
  1188.     int j, j1, j2, j3;
  1189.     int k, k1;
  1190.     int data;
  1191.     int a1, a2;
  1192.     int n1, n2, n3;
  1193.  
  1194.     WORD( bbuf+i ) = 0x1222; i+=2;    /* stosw brock */
  1195.     p1 = i; i+=4;            /* size point */
  1196.     p2 = i; i+=2;            /* data count point */
  1197.     n1 = 0;                /* data count */
  1198.     for( j1=0 ; j1<153600 ; j1+=2 ){
  1199.         if( WORD( rbuf+j1 ) & 0x8000 )goto stos03;    /* 処理済skip */
  1200.         j = ( (j1/640) << 10 ) + ( j1 % 640 );    /* j = vram address */
  1201.         data = peekw( j, 0x104 );
  1202.         if(
  1203.           mov_save_skip_check6( data, j1, svar )
  1204.         )goto stos03;        /* skip check */
  1205.         p3 = i;            /* data top point */
  1206.         WORD( bbuf+i ) = data; i+=2;    /* data */
  1207.         p4 = i; i+=2;        /* offset count point */
  1208.         n2 = 0;            /* offset count */
  1209.         for( j2=0 ; j2<3 ; j2++ ){ /* offset loop */
  1210.         p5 = i;            /* offset top point */
  1211.         WORD( bbuf+i ) = j2; i+=2;    /* offset */
  1212.         p6 = i; i+=2;        /* d-address count point */
  1213.         n3 = 0;            /* d-address count */
  1214.         k = 0; k1 = 0;        /* data長count係数 */
  1215.         for( j3=0x10000*j2 ; j3<0x10000*(j2+1) ; j3+=2 ){
  1216.             if( j3 >= 153600 )break;
  1217.             a2 = WORD( rbuf+j3 );
  1218.             if( a2 & 0x8000 ){            /* 処理済skip */
  1219.             if( k ){
  1220.                 i = i + k1;
  1221.                 k = 0; k1 = 0;
  1222.             }
  1223.             goto stos01;
  1224.             }
  1225.              j = ( (j3/640) << 10 ) + ( j3 % 640 );
  1226.             a1 = peekw( j, 0x104 );
  1227.             if( (a2 & 0x8000) == 0         /* 手つかず */
  1228.                 && mov_save_cmp_data( data, a1, svar[2] ) == 0 
  1229.                                 /* 同色と認め */ 
  1230.             ){
  1231.             if( k == 0 )if( 
  1232.               mov_save_skip_check4(data,j3,svar)
  1233.             )goto stos01;
  1234.             k++;
  1235.             WORD( rbuf+j3 ) = 0x8000 | data;    /* 処理印 */
  1236.             xorw( j, 0x104, 0xffff );
  1237.             if( k == 1 ){
  1238.                 n3++;
  1239.                 WORD( bbuf+i ) = ( j3 & 0xffff );
  1240.             }
  1241.             if( k<0xff ){
  1242.                 BYTE( bbuf+i+2 ) = k;
  1243.                 k1 = 1+2;
  1244.             }
  1245.             if( (k>=0xff) && (k<0xffff) ){
  1246.                 BYTE( bbuf+i+2 ) = 0xff;
  1247.                 WORD( bbuf+i+3 ) = k;
  1248.                 k1 = 3+2;
  1249.             }
  1250.             if( k>=0xffff ){
  1251.                 BYTE( bbuf+i+2 ) = 0xff;
  1252.                 WORD( bbuf+i+3 ) = 0xffff;
  1253.                 DWORD( bbuf+i+5 ) = k;
  1254.                 k1 = 7+2;
  1255.             }
  1256.             }
  1257.             else {
  1258.             if( k ){
  1259.                 i = i + k1;
  1260.                 k = 0; k1 = 0;
  1261.             }
  1262.             }
  1263.         stos01: ;
  1264.         }
  1265.     stos02:    i = i + k1;
  1266.         WORD( bbuf+p6 ) = n3;
  1267.         if( n3 )n2++;
  1268.         else i = p5;
  1269.         }
  1270.         WORD( bbuf+p4 ) = n2;
  1271.         if( n2 )n1++;
  1272.         else i = p3;
  1273.     stos03: ;
  1274.     }
  1275.     WORD( bbuf+p2 ) = n1;
  1276.     if( n1 == 0 )i = p2;
  1277.     DWORD( bbuf+p1 ) = i - p2;
  1278.     return i;
  1279. }
  1280.  
  1281. mov_save_skip_check2( data, n, svar )
  1282. int data, n;
  1283. int svar[];
  1284. {            /* 4つdataと同じ色が続くもの以外はスキップ */
  1285.     int a, b, i, j, k;
  1286.  
  1287.     if( n > 153588 )return 1;
  1288.     if( WORD( rbuf+n ) & 0x8000 )return 1;
  1289.     for( i=0 ; i<4 ; i++ ){
  1290.         k = n + (i << 1);
  1291.         j = ( (k/640) << 10 ) + ( k % 640 );
  1292.         a = peekw( j, 0x104 );
  1293.         b = WORD( rbuf + k );
  1294.         if( mov_save_cmp_data( data, a, svar[2]) )return 1;
  1295.     }
  1296.     return 0;
  1297. }
  1298.  
  1299. /* skip_check1 = 1:skip ( for stosw ) */
  1300.  
  1301. mov_save_skip_check4( data, n, svar )
  1302. int data, n;
  1303. int svar[];
  1304. {            /* 4つdataと同じ色が続くもの以外はスキップ */
  1305.     int a, b, i, j, k;
  1306.  
  1307.     if( n > 153588 )return 1;    /* ↓処理済直後はok */
  1308.     if( n && ( (DWORD( rbuf+n-2 ) & 0x80008000) == 0x8000 ) )return 0;
  1309.     if( WORD( rbuf+n ) & 0x8000 )return 1;
  1310.     for( i=0 ; i<4 ; i++ ){
  1311.         k = n + (i << 1);
  1312.         j = ( (k/640) << 10 ) + ( k % 640 );
  1313.         a = peekw( j, 0x104 );
  1314.         b = WORD( rbuf + k );
  1315.         if( b & 0x8000 )return 0;
  1316.         if( mov_save_cmp_data( data, a, svar[2]) )return 1;
  1317.     }
  1318.     return 0;
  1319. }
  1320.  
  1321. mov_save_skip_check6( data, n, svar )
  1322. int data, n;
  1323. int svar[];
  1324. {            /* 6つdataと同じ色が続くもの以外はスキップ */
  1325.     int a, b, i, j, k;
  1326.  
  1327.     if( n > 153588 )return 1;
  1328.     if( DWORD( rbuf+n ) & 0x80008000 )return 1;
  1329.     if( DWORD( rbuf+n+4 ) & 0x80008000 )return 1;
  1330.     if( DWORD( rbuf+n+8 ) & 0x80008000 )return 1;
  1331.     for( i=0 ; i<6 ; i++ ){
  1332.         k = n + (i << 1);
  1333.         j = ( (k/640) << 10 ) + ( k % 640 );
  1334.         a = peekw( j, 0x104 );
  1335.         b = WORD( rbuf + k );
  1336.         if( mov_save_cmp_data( data, a, svar[2]) )return 1;
  1337.     }
  1338.     return 0;
  1339. }
  1340.  
  1341. /* movsw */
  1342.  
  1343. mov_save_movsw( i )
  1344. int i;
  1345. {
  1346.     int p1, p4, p5, p6;
  1347.     int j, j2, j3, j4;
  1348.     int k, k1, k2;
  1349.     int a1, a2;
  1350.     int n2, n3;
  1351.  
  1352.     WORD( bbuf+i ) = 0x2222; i+=2;    /* movsw brock */
  1353.     p1 = i; i+=4;            /* size point */
  1354.     p4 = i; i+=2;        /* offset count point */
  1355.     n2 = 0;            /* offset count */
  1356.     for( j2=0 ; j2<3 ; j2++ ){ /* offset loop */
  1357.         p5 = i;            /* offset top point */
  1358.         WORD( bbuf+i ) = j2; i+=2;    /* offset */
  1359.         p6 = i; i+=2;        /* d-address count point */
  1360.         n3 = 0;            /* d-address count */
  1361.         k = 0; k1 = 0;        /* data長count係数 */
  1362.         for( j3=0x10000*j2 ; j3<0x10000*(j2+1) ; j3+=2 ){
  1363.         if( j3 >= 153600 )break;
  1364.          j = ( (j3/640) << 10 ) + ( j3 % 640 );        /* vram add */
  1365.         a1 = peekw( j, 0x104 ); a2 = WORD( rbuf+j3 );
  1366.         if( (a2 & 0x8000) == 0 ){
  1367.             k++;
  1368.             WORD( rbuf+j3 ) = 0x8000 | a1;        /* 処理印 */
  1369.             xorw( j, 0x104, 0xffff );
  1370.             if( k == 1 ){
  1371.             n3++;
  1372.             k2 = j3;            /* address記憶 */
  1373.             WORD( bbuf+i ) = ( j3 & 0xffff );
  1374.             }
  1375.             if( k<0xff ){
  1376.             BYTE( bbuf+i+2 ) = k;
  1377.             k1 = 1+2;
  1378.             }
  1379.             if( (k>=0xff) && (k<0xffff) ){
  1380.             BYTE( bbuf+i+2 ) = 0xff;
  1381.             WORD( bbuf+i+3 ) = k;
  1382.             k1 = 3+2;
  1383.             }
  1384.             if( k>=0xffff ){
  1385.             BYTE( bbuf+i+2 ) = 0xff;
  1386.             WORD( bbuf+i+3 ) = 0xffff;
  1387.             DWORD( bbuf+i+5 ) = k;
  1388.             k1 = 7+2;
  1389.             }
  1390.         }
  1391.         else {
  1392.             if( k ){
  1393.             i = i + k1;
  1394.             k = 0; k1 = 0;
  1395.             for( j4=k2 ; j4<j3 ; j4+=2 ){ /* data write */
  1396.                 WORD( bbuf+i ) = WORD( rbuf+j4 ) & 0x7fff;
  1397.                 i+=2;
  1398.             }
  1399.             }
  1400.         }
  1401.     movs01: ;
  1402.         }
  1403.     movs02: if( k ){
  1404.         i = i + k1;
  1405.         k = 0; k1 = 0;
  1406.         for( j4=k2 ; j4<j3 ; j4+=2 ){ /* data write */
  1407.             WORD( bbuf+i ) = WORD( rbuf+j4 ) & 0x7fff;
  1408.             i+=2;
  1409.         }
  1410.         }
  1411.         WORD( bbuf+p6 ) = n3;
  1412.         if( n3 )n2++;
  1413.         else i = p5;
  1414.      }
  1415.     WORD( bbuf+p4 ) = n2;
  1416.     if( n2 == 0 )i = p4;
  1417.     DWORD( bbuf+p1 ) = i - p4;
  1418.     return i;
  1419. }
  1420.  
  1421. /* move all box ( 16*16dot )全域のboxを転送 */
  1422.  
  1423. mov_save_move_all_box_16( i, svar )
  1424. int i, svar[];
  1425. {
  1426.     int p1, p2;
  1427.     int j, j2, j3;
  1428.     int xmin, xmax, ymin, ymax, x, y, x1, y1, x2, y2, kx, ky;
  1429.     int max, a, a1, a2, b, r, g, cr, cb, yu, temp, temp2;
  1430.     int bfaddr, rbaddr, vraddr;
  1431.     char *offset1, *offset2;
  1432.     char vyuv[1024];        /* vram YUV data */
  1433.  
  1434.     offset1 = bbuf+0x1000;    /* 旧画面データをchar *offset1にもう1枚作る */
  1435.     for( j=0 ; j<153600 ; j+=4 )DWORD( offset1+j ) = DWORD( rbuf+j );
  1436.     offset2 = bbuf+0x30000;    /* 旧画面データのYUV data */
  1437.         /* rgb data (offset1) を yuv data (offset2) に */
  1438.     for( j=0 ; j<76800 ; j++ ){
  1439.         a = WORD( offset1 + (j << 1) );
  1440.         b = a & 0x1f;
  1441.         r = (a >> 5) & 0x1f;
  1442.         g = (a >> 10) & 0x1f;
  1443.             /* G,R,BをY,Cr,Cbに変換 */
  1444.         cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  1445.         cb = -85*g - 43*r + 128*b + 3968;
  1446.         yu = ( 150*g + 77*r + 37*b ) >> 4;
  1447.             /* Cr(8), Cb(8), Y(16) */
  1448.         DWORD( offset2 +(j << 2) )
  1449.          = (cr >> 5) + ((cb << 3)& 0x0ff00) + (yu << 16);
  1450.     }
  1451.     xmin = 16*( svar[4]/16 ); if( svar[4]%16 )xmin += 16;
  1452.     xmax = 16*( svar[6]/16 ); if( svar[6]%16 == 15 )xmax += 1;
  1453.     ymin = 16*( svar[5]/16 ); if( svar[5]%16 )ymin += 16;
  1454.     ymax = 16*( svar[7]/16 ); if( svar[7]%16 == 15 )ymax += 1;
  1455.  
  1456.     WORD( bbuf+i ) = 0x3110; i+=2;    /* move all box 16 */
  1457.     p1 = i; i+=4;            /* size point */
  1458.     p2 = i;
  1459.     for( y=0 ; y<240 ; y+=16 ){
  1460.         for( x=0 ; x<320 ; x+=16 ){
  1461.             /* vram YUV */
  1462.         if( x < xmin || x >= xmax
  1463.          || y < ymin || y >= ymax
  1464.         ){
  1465.             kx = x;
  1466.             ky = y;
  1467.             goto mov01;
  1468.         }
  1469.         vraddr = y*1024 + x*2;     /* vram address */
  1470.         j = 0;            /* count vyuv */
  1471.         for( j2=0 ; j2<16 ; j2++ ){
  1472.             for( j3=0 ; j3<32 ; j3+=2 ){
  1473.             a = peekw( vraddr+j3, 0x104 );
  1474.             b = a & 0x1f;
  1475.             r = (a >> 5) & 0x1f;
  1476.             g = (a >> 10) & 0x1f;
  1477.                 /* G,R,BをY,Cr,Cbに変換 */
  1478.             cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  1479.             cb = -85*g - 43*r + 128*b + 3968;
  1480.             yu = ( 150*g + 77*r + 37*b ) >> 4;
  1481.                 /* Cr(8), Cb(8), Y(16) */
  1482.             DWORD( vyuv +j )
  1483.              = (cr >> 5) + ((cb << 3) & 0x0ff00) + (yu << 16);
  1484.             j+=4;
  1485.             }
  1486.             vraddr += 1024;
  1487.         }
  1488.         temp2 = mov_save_cmp_box16( offset2, x, y, vyuv, svar[2] );
  1489.         max = temp2;
  1490.         kx = x; ky = y;
  1491.         if( temp2 > 255-8 )goto mov01;
  1492.             /* 1dotづつずらして調べる */
  1493.         x1 = x - svar[3]; if( x1 < 0 )x1 = 0;
  1494.         x2 = x + svar[3]; if( x2 > 304 )x2 = 304;
  1495.         y1 = y - svar[3]; if( y1 < 0 )y1 = 0;
  1496.         y2 = y + svar[3]; if( y2 > 224 )y2 = 224;
  1497.         for( j2 = x1 ; j2 <= x2 ; j2++ ){
  1498.             for( j3 = y1 ; j3 <= y2 ; j3++ ){
  1499.             temp
  1500.             = mov_save_cmp_box16( offset2, j2, j3, vyuv, svar[2] );
  1501.             if( temp > max ){
  1502.                 max = temp;
  1503.                 kx = j2; ky = j3;
  1504.             }
  1505.             }
  1506.         }
  1507.             /* 大まかに調べる */
  1508.         x1 = x - 32; if( x1 < 0 )x1 = 0;
  1509.         x2 = x + 32; if( x2 > 304 )x2 = 304;
  1510.         y1 = y - 32; if( y1 < 0 )y1 = 0;
  1511.         y2 = y + 32; if( y2 > 224 )y2 = 224;
  1512.         for( j2 = x1 ; j2 <= x2 ; j2+=16 ){
  1513.             for( j3 = y1 ; j3 <= y2 ; j3+=16 ){
  1514.             temp
  1515.             = mov_save_cmp_box16( offset2, j2, j3, vyuv, svar[2] );
  1516.             if( temp > max ){
  1517.                 max = temp;
  1518.                 kx = j2; ky = j3;
  1519.             }
  1520.             }
  1521.         }
  1522.     mov01:    WORD( bbuf+i ) = kx; i+=2;
  1523.         WORD( bbuf+i ) = ky; i+=2;
  1524.         bfaddr = ky*640 + kx*2;     /* offset1 相対 address */
  1525.         rbaddr = y*640 + x*2;     /* rbuf 相対 address */
  1526.         vraddr = y*1024 + x*2;     /* vram address */
  1527.         for( j2=0 ; j2<16 ; j2++ ){
  1528.             for( j3=0 ; j3<32 ; j3+=2 ){
  1529.                 a1 = peekw( vraddr+j3, 0x104 );
  1530.                 a2 = WORD( offset1+bfaddr+j3 ) & 0x7fff;
  1531.                 WORD( rbuf+rbaddr+j3 ) = a2;
  1532.                 if( (a1 & 0x8000) == 0 ){
  1533.                   if( mov_save_cmp_data( a1, a2, svar[2] )==0 ){
  1534.                 WORD( rbuf+rbaddr+j3 ) = a2 | 0x8000;
  1535.                 xorw( vraddr+j3, 0x104, 0xffff );
  1536.                   }
  1537.                 }
  1538.                 else WORD( rbuf+rbaddr+j3 ) = a2 | 0x8000;
  1539.             }
  1540.             bfaddr+=640; rbaddr+=640; vraddr+=1024;
  1541.         }
  1542.         }
  1543.     }
  1544.     DWORD( bbuf+p1 ) = i - p2;
  1545.     return i;
  1546. }
  1547.  
  1548. /* move box ( 16*16dot )指定されたboxを転送 */
  1549.  
  1550. mov_save_movebox16( i, svar )
  1551. int i, svar[];
  1552. {
  1553.     int p1, p2, n;
  1554.     int j, j2, j3;
  1555.     int xmin, xmax, ymin, ymax, x, y, x1, y1, x2, y2, kx, ky;
  1556.     int max, a, a1, a2, b, r, g, cr, cb, yu, temp, temp2;
  1557.     int bfaddr, rbaddr, vraddr;
  1558.     char *offset1, *offset2;
  1559.     char vyuv[1024];        /* vram YUV data */
  1560.  
  1561.     offset1 = bbuf+0x1000;    /* 旧画面データをchar *offset1にもう1枚作る */
  1562.     for( j=0 ; j<153600 ; j+=4 )DWORD( offset1+j ) = DWORD( rbuf+j );
  1563.     offset2 = bbuf+0x30000;    /* 旧画面データのYUV data */
  1564.         /* rgb data (offset1) を yuv data (offset2) に */
  1565.     for( j=0 ; j<76800 ; j++ ){
  1566.         a = WORD( offset1 + (j << 1) );
  1567.         b = a & 0x1f;
  1568.         r = (a >> 5) & 0x1f;
  1569.         g = (a >> 10) & 0x1f;
  1570.             /* G,R,BをY,Cr,Cbに変換 */
  1571.         cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  1572.         cb = -85*g - 43*r + 128*b + 3968;
  1573.         yu = ( 150*g + 77*r + 37*b ) >> 4;
  1574.             /* Cr(8), Cb(8), Y(16) */
  1575.         DWORD( offset2 +(j << 2) )
  1576.          = (cr >> 5) + ((cb << 3)& 0x0ff00) + (yu << 16);
  1577.     }
  1578.  
  1579.     WORD( bbuf+i ) = 0x3010; i+=2;    /* move box 16 */
  1580.     p1 = i; i+=4;            /* size point */
  1581.     p2 = i; i+=2;        /* data 個数 count point */
  1582.     n = 0;            /* data 個数 count */
  1583.         /* trimming area を はずすためのもの */
  1584.     xmin = 16*( svar[4]/16 ); if( svar[4]%16 )xmin += 16;
  1585.     xmax = 16*( svar[6]/16 ); if( svar[6]%16 == 15 )xmax += 1;
  1586.     ymin = 16*( svar[5]/16 ); if( svar[5]%16 )ymin += 16;
  1587.     ymax = 16*( svar[7]/16 ); if( svar[7]%16 == 15 )ymax += 1;
  1588.     for( y=ymin ; y<ymax ; y+=16 ){
  1589.         for( x=xmin ; x<xmax ; x+=16 ){
  1590.             /* vram YUV */
  1591.         vraddr = y*1024 + x*2;     /* vram address */
  1592.         j = 0;            /* count vyuv */
  1593.         for( j2=0 ; j2<16 ; j2++ ){
  1594.             for( j3=0 ; j3<32 ; j3+=2 ){
  1595.             a = peekw( vraddr+j3, 0x104 );
  1596.             b = a & 0x1f;
  1597.             r = (a >> 5) & 0x1f;
  1598.             g = (a >> 10) & 0x1f;
  1599.                 /* G,R,BをY,Cr,Cbに変換 */
  1600.             cr = -107*g + 128*r - 21*b + 3968;    /* 0~256*31 */
  1601.             cb = -85*g - 43*r + 128*b + 3968;
  1602.             yu = ( 150*g + 77*r + 37*b ) >> 4;
  1603.                 /* Cr(8), Cb(8), Y(16) */
  1604.             DWORD( vyuv +j )
  1605.              = (cr >> 5) + ((cb << 3) & 0x0ff00) + (yu << 16);
  1606.             j+=4;
  1607.             }
  1608.             vraddr += 1024;
  1609.         }
  1610.         temp2 = mov_save_cmp_box16( offset2, x, y, vyuv, svar[2] );
  1611.         if( temp2 > 255-8 )goto mov02;
  1612.         max = temp2;
  1613.         kx = x; ky = y;
  1614.             /* 1dotづつずらして調べる */
  1615.         x1 = x - svar[3]; if( x1 < 0 )x1 = 0;
  1616.         x2 = x + svar[3]; if( x2 > 304 )x2 = 304;
  1617.         y1 = y - svar[3]; if( y1 < 0 )y1 = 0;
  1618.         y2 = y + svar[3]; if( y2 > 224 )y2 = 224;
  1619.         for( j2 = x1 ; j2 <= x2 ; j2++ ){
  1620.             for( j3 = y1 ; j3 <= y2 ; j3++ ){
  1621.             temp
  1622.             = mov_save_cmp_box16( offset2, j2, j3, vyuv, svar[2] );
  1623.             if( temp > max ){
  1624.                 max = temp;
  1625.                 kx = j2; ky = j3;
  1626.             }
  1627.             }
  1628.         }
  1629.             /* 大まかに調べる */
  1630.         x1 = x - 32; if( x1 < 0 )x1 = 0;
  1631.         x2 = x + 32; if( x2 > 304 )x2 = 304;
  1632.         y1 = y - 32; if( y1 < 0 )y1 = 0;
  1633.         y2 = y + 32; if( y2 > 224 )y2 = 224;
  1634.         for( j2 = x1 ; j2 <= x2 ; j2+=16 ){
  1635.             for( j3 = y1 ; j3 <= y2 ; j3+=16 ){
  1636.             temp
  1637.             = mov_save_cmp_box16( offset2, j2, j3, vyuv, svar[2] );
  1638.             if( temp > max ){
  1639.                 max = temp;
  1640.                 kx = j2; ky = j3;
  1641.             }
  1642.             }
  1643.         }
  1644.         if( max > temp2+8 ){
  1645.             DWORD( bbuf+i ) = y*640 + x*2; i+=4;
  1646.             WORD( bbuf+i ) = kx; i+=2;
  1647.             WORD( bbuf+i ) = ky; i+=2;
  1648.             n++;
  1649.             bfaddr = ky*640 + kx*2;     /* offset1 相対 address */
  1650.             rbaddr = y*640 + x*2;     /* rbuf 相対 address */
  1651.             vraddr = y*1024 + x*2;     /* vram address */
  1652.             for( j2=0 ; j2<16 ; j2++ ){
  1653.             for( j3=0 ; j3<32 ; j3+=2 ){
  1654.                 a1 = peekw( vraddr+j3, 0x104 );
  1655.                 a2 = WORD( offset1+bfaddr+j3 ) & 0x7fff;
  1656.                 WORD( rbuf+rbaddr+j3 ) = a2;
  1657.                 if( mov_save_cmp_data( a1, a2, svar[2] ) == 0 
  1658.                  && (a1 & 0x8000) == 0 ){
  1659.                 WORD( rbuf+rbaddr+j3 ) = a2 | 0x8000;
  1660.                 xorw( vraddr+j3, 0x104, 0xffff );
  1661.                 }
  1662.             }
  1663.             bfaddr+=640; rbaddr+=640; vraddr+=1024;
  1664.             }
  1665.         mov02:  ;
  1666.         }
  1667.         }
  1668.     }
  1669.     WORD( bbuf+p2 ) = n;
  1670.     if( n == 0 )i = p2;
  1671.     DWORD( bbuf+p1 ) = i - p2;
  1672.     return i;
  1673. }
  1674.  
  1675. /* YUV data buffer の char buffer(320*240)[開始座標(x,y)]と
  1676. char *vyuv(16*16)の中でYUV判定で同じものを数える */
  1677.  
  1678. mov_save_cmp_box16( buffer, x, y, vyuv, rate )
  1679. char *buffer, *vyuv;
  1680. int x, y, rate;
  1681. {
  1682.     int d1, d2, i, j, n, rate2;
  1683.  
  1684.     buffer = buffer + 1280*y + 4*x;
  1685.     n = 0; rate2 = rate*rate;
  1686.     for( j=0 ; j<16 ; j++ ){
  1687.         for( i=0 ; i<64 ; i+=4 ){
  1688.             d1 = (WORD( buffer+i+2 ) - WORD( vyuv+2 ));
  1689.             if( d1 > rate )goto cmp01;
  1690.             if( d1 < -rate )goto cmp01;
  1691.             d1 = BYTE( buffer+i ) - BYTE( vyuv );
  1692.             d2 = BYTE( buffer+i+1 ) - BYTE( vyuv+1 );
  1693.             if( d1*d1 + d2*d2 <= rate2 )n++;
  1694.         cmp01:  vyuv += 4;
  1695.         }
  1696.         buffer += 1280;
  1697.     }
  1698.     return n;
  1699. }
  1700.  
  1701. /* Y,Cr,CbによるCOLCOR DATA比較法 91 7 24 */
  1702.  
  1703. mov_save_cmp_data( a, b, rate )
  1704. int a, b, rate;
  1705. {
  1706.     int b1,r1,g1, b2,r2,g2, d1, d2;
  1707.  
  1708.     if( (a & 0x7fff) == (b & 0x7fff) )return 0; /* 明白なものは処理 */
  1709.     else if( rate == 0 )return 1;
  1710.         /* G,R,B算出 */
  1711.     b1 = a & 0x1f; b2 = b & 0x1f;
  1712.     r1 = (a >> 5) & 0x1f; r2 = (b >> 5) & 0x1f;
  1713.     g1 = (a >> 10) & 0x1f; g2 = (b >> 10) & 0x1f;
  1714.         /* G,R,BをY,Cr,Cbに変換 & 判定 */
  1715.     d1 = ( 150*(g2 - g1) + 77*(r2 - r1) + 37*(b2 - b1) ) >> 4;
  1716.     if( d1 > rate )return 1;
  1717.     if( d1 < -rate )return 1;
  1718.     d1 = ( -107*(g2-g1) + 128*(r2-r1) - 21*(b2-b1) ) >> 5;
  1719.     d2 = ( -85*(g2 -g1) - 43*(r2 -r1) + 128*(b2 -b1) ) >> 5;
  1720.     if( d1*d1 + d2*d2 > rate*rate )return 1;
  1721.     else return 0;
  1722. }
  1723.  
  1724.